Zigzag iterator

Time: O(N); Space: O(K); medium

Given two 1d vectors, implement an iterator to return their elements alternately.

Example 1:

Input: v1 = [1, 2], v2 = [3, 4, 5, 6]

Output: [1, 3, 2, 4, 5, 6]

Explanation:

  • By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1, 3, 2, 4, 5, 6].

Example 2:

Input: v1 = [1, 1, 1, 1], v2 = [3, 4, 5, 6]

Output: [1, 3, 1, 4, 1, 5, 1, 6]

[10]:
import collections

class ZigzagIterator(object):
    def __init__(self, v1, v2):
        """
        Initialize your q structure here.
        :type v1: List[int]
        :type v2: List[int]
        """
        self.q = collections.deque([(len(v), iter(v)) for v in (v1, v2) if v])

    def next(self):
        """
        :rtype: int
        """
        len, iter = self.q.popleft()
        if len > 1:
            self.q.append((len-1, iter))
        return next(iter)

    def hasNext(self):
        """
        :rtype: bool
        """
        return bool(self.q)
[11]:
v1 = [1, 2]
v2 = [3, 4, 5, 6]
s = ZigzagIterator(v1, v2)
res = [1, 3, 2, 4, 5, 6]
i = 0
while s.hasNext():
    assert s.next() == res[i]
    i +=1


v1 = [1, 1, 1, 1]
v2 = [3, 4, 5, 6]
s = ZigzagIterator(v1, v2)
res =  [1, 3, 1, 4, 1, 5, 1, 6]
i = 0
while s.hasNext():
    assert s.next() == res[i]
    i +=1